home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / launchpadbugs / utils.py < prev    next >
Text File  |  2008-08-27  |  6KB  |  198 lines

  1. # Written by Henrik Nilsen Omma
  2. # (C) Canonical, Ltd. Licensed under the GPL
  3.  
  4. import os
  5. import re
  6. import subprocess
  7. import apt_pkg
  8. import libxml2
  9. import urlparse
  10.  
  11. from exceptions import LaunchpadURLError, PythonLaunchpadBugsValueError
  12. from lpconstants import BASEURL
  13.  
  14. try:
  15.     from bzrlib.branch import Branch
  16.     from bzrlib import trace
  17.     HAVE_BZR = True    
  18. except:
  19.     HAVE_BZR = False
  20.  
  21. def get_version_from_changelog(path):
  22.     # look/set what version we have
  23.     changelog = os.path.join(path, "debian/changelog")
  24.     if os.path.exists(changelog):
  25.         head=open(changelog).readline()
  26.         match = re.compile(".*\((.*)\).*").match(head)
  27.         if match:
  28.             return match.group(1)
  29.     return "unknown"
  30.     
  31.  
  32. # deactivate error messages from the validation [libxml2.htmlParseDoc]
  33. def noerr(ctx, str):
  34.     pass
  35.  
  36. libxml2.registerErrorHandler(noerr, None)
  37.  
  38. def find_version_number(show_nick=False):
  39.     path = os.path.join(os.path.dirname(__file__), "..")
  40.  
  41.     # We're using a package
  42.     if path.startswith('/usr'):
  43.         output = subprocess.Popen(["dpkg-query", "-W", "python-launchpad-bugs"], 
  44.                                    stdout=subprocess.PIPE).communicate()[0]
  45.         try:
  46.             return output.split()[1]
  47.         except:
  48.             # not installed as a package
  49.             return "unknown"
  50.     if HAVE_BZR:
  51.         try:
  52.         trace.be_quiet()
  53.         trace.enable_default_logging()
  54.             version = get_version_from_changelog(path)
  55.             if os.path.islink(os.path.dirname(__file__)):
  56.                 path = os.path.realpath(os.path.dirname(__file__))
  57.             branch = Branch.open_containing(path)[0]
  58.             bzr_revno = branch.revno()
  59.             if show_nick:
  60.                 nick = branch.nick
  61.                 return "%sr%s, branch nick: %s" % (version, bzr_revno, nick)
  62.             else:
  63.                 return "%sr%s" % (version, bzr_revno)
  64.         except:
  65.             pass
  66.     return "unknown"
  67.  
  68. def package_exists(package_name):
  69.     try:
  70.         apt_pkg.init()
  71.         sources = apt_pkg.GetPkgSrcRecords()
  72.         sources.Restart()
  73.         if not sources.Lookup(str(package_name)):
  74.             return False
  75.         else:
  76.             return True
  77.     except:
  78.         print "You must put some 'source' URIs in your sources.list"
  79.         return False
  80.  
  81. def lazy_makedir(directory):
  82.     try:
  83.         os.makedirs(directory)
  84.     except:
  85.         pass
  86.     
  87. def remove_obsolete_attachments(path, open_bugs):
  88.     open_bug_nrs = set(map(lambda a: str(a.nr), open_bugs))
  89.     if os.path.exists(path):
  90.         bugs = set(filter(lambda a: os.path.isdir(os.path.join(path, a)), 
  91.                           os.listdir(path)))
  92.         for bug in bugs.difference(bugs.intersection(open_bug_nrs)):
  93.             bug_path = os.path.join(path, bug)
  94.             if os.path.isdir(bug_path):
  95.                 os.system("rm -r %s" % bug_path)
  96.                 
  97.       
  98. def bugnumber_to_url(nr):
  99.     return "%s/bugs/%s" %(BASEURL.BUG, nr)
  100.  
  101. def valid_lp_url(url, type):
  102.     """ validates given 'url' against 'type'
  103.     raises PythonLaunchpadBugsValueError for invalid url and modifies
  104.     if necessary. Currently only validation for 'scheme' and 'netloc'
  105.     part of the url is implemented, path needs to be done but is more
  106.     complicated.    
  107.     """
  108.     if not url:
  109.         raise PythonLaunchpadBugsValueError(msg="url is empty")
  110.     scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
  111.     
  112.     # adjust type
  113.     # we only need netloc part as type
  114.     _, type, x, _, _ = urlparse.urlsplit(type)
  115.     if not type:
  116.         type = x
  117.     assert type, "unable to validate against given type"
  118.     
  119.     if not scheme and not netloc:
  120.         if not path.startswith("/"):
  121.             scheme = "http"
  122.             x = path.split("/", 1)
  123.             if len(x) == 1:
  124.                 netloc = x[0]
  125.                 path = ""
  126.             else:
  127.                 netloc = x[0]
  128.                 path = x[1]
  129.     # check scheme
  130.     # change http:// to https:// as they will be redirected anyway
  131.     if not scheme or scheme == "http":
  132.         scheme = "https"
  133.     if not scheme in ("http", "https"):
  134.         raise PythonLaunchpadBugsValueError(values={"url": url, "type": type}, msg="Wrong schema")
  135.     # check netloc based on type
  136.     if not netloc:
  137.         netloc = type
  138.     else:
  139.         n = netloc
  140.         prefix = None
  141.         if "edge." in netloc:
  142.             n = netloc.replace("edge.", "")
  143.             prefix = "edge"
  144.         elif "staging." in netloc:
  145.             n = netloc.replace("staging.", "")
  146.             prefix = "staging"
  147.         if n != type:
  148.             if n == "launchpad.net":
  149.                 # 'https://launchpad.net/*' is automatically redirected to the best url
  150.                 netloc = type
  151.                 if prefix:
  152.                     netloc = netloc.replace(".launchpad", ".%s.launchpad" %prefix)
  153.             else:
  154.                 raise PythonLaunchpadBugsValueError(values={"url": url, "type": type}, msg="Wrong type")
  155.     
  156.     return urlparse.urlunsplit((scheme, netloc, path, query, fragment))
  157.         
  158.         
  159. def debug(*arg,**args):
  160.     for i in arg:
  161.         if type(i) == type(dict()):
  162.             for k in i:
  163.                 print "%s : %s" %(k, i[k])
  164.         else:
  165.             print i
  166.     for k in args:
  167.         print k, args[k]
  168.         
  169.         
  170. def get_open_milestones(dist=None, package=None, project=None):
  171.     url = BASEURL.BUG
  172.     if dist:
  173.         url += "/%s" %dist
  174.         if package:
  175.             url += "/+source/%s" %package
  176.     elif project:
  177.         url += "/%s" %project
  178.     else:
  179.         raise TypeError, "Wrong number of arguments"
  180.     url += "/+bugs?advanced=1"
  181.     try:
  182.         from http_connection import HTTPConnection
  183.         text = HTTPConnection().get(url).text
  184.     except LaunchpadURLError:
  185.         raise PythonLaunchpadBugsValueError({"get_open_milestones":"Can't find milestones for (dist=%s, package=%s, project=%s)" %(dist, package, project)},
  186.                                              url)
  187.     ctx = libxml2.htmlParseDoc(text, "UTF-8")
  188.     milestones = ctx.xpathEval('//input[@name="field.milestone:list"]')
  189.     for m in milestones:
  190.         identifier = m.prop("id").split(".", 1).pop()
  191.         yield (identifier, int(m.prop("value")))
  192.         x = identifier.split(" ")[1:]
  193.         if x:
  194.             yield (" ".join(x), int(m.prop("value")))
  195.     
  196.     
  197.     
  198.